package com.gluxen.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.gluxen.common.constant.SystemConstant;
import com.gluxen.entity.User;
import com.gluxen.po.AutoReply;
import com.gluxen.service.UserService;
import com.gluxen.util.DateUtil;
import com.gluxen.util.MessageUtil;
import com.gluxen.util.checkUtil;
import com.gluxen.util.weixinUtil;

import org.dom4j.DocumentException;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
public class WeixinController extends BaseController {
@Resource
UserService userService;

public static String ToUserName;
public static String FromUserName;
public static final Integer INTERATION_RISE = 5;
public static  AutoReply autoReply = weixinUtil.init_autoReply();

/**
 * token验证
 */
@RequestMapping(value="weixin.json",method=RequestMethod.GET)
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException,IOException {
	String signature = req.getParameter("signature");
	String timestamp = req.getParameter("timestamp");
	String nonce = req.getParameter("nonce");
	String echostr = req.getParameter("echostr");
	
	PrintWriter outPrintWriter = resp.getWriter();
	if(checkUtil.checkSignature(signature, timestamp, nonce)){
		outPrintWriter.print(echostr);
	}
}

/**
 * 处理客户端发来的文本消息。
 */
@SuppressWarnings("unchecked")
@RequestMapping(value="weixin.json",method=RequestMethod.POST)
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException,IOException{
	req.setCharacterEncoding("utf-8");
	resp.setCharacterEncoding("utf-8");
//	HttpSession session = req.getSession();
//	session.setAttribute("openid",FromUserName);
//	ServletContext context = this.getServletContext();

	PrintWriter out= resp.getWriter();

	try {
		Map<String, String> map = MessageUtil.XmlToMap(req);
		ToUserName = map.get("ToUserName");
		FromUserName = map.get("FromUserName");
		
		String MsgType = map.get("MsgType");
		String Content = map.get("Content");
		String message = null;
		
		if(MsgType.equals(MessageUtil.MESSAGE_TEXT)){
			//如果自动回复功能开启。
			message= weixinUtil.get_autoreply_message(ToUserName, FromUserName, Content);
			/*if("1".equals(Content)){
				message = MessageUtil.initTextMessage(ToUserName, FromUserName, MessageUtil.halfText(userService.queryListByNavtiveSql("select INTEGRATION from USER where USER.OPENID ='"+FromUserName+"'").toString()));
			}else if("2".equals(Content)){
				message = MessageUtil.initTextMessage(ToUserName, FromUserName, "中国农业银行股份有限公司是中国主要的综合性金融服务提供商之一，致力于建设多功能协同的现代金融服务集团。服务热线95599。\n\t\t中国农业银行（Agricultural Bank of China，简称ABC，农行）是中国大型上市银行，中国五大银行之一。最初成立于1951年，是新中国成立的第一家国有商业银行，也是中国金融体系的重要组成部分，总行设在北京。数年来，中国农行一直位居世界五百强企业之列，在“全球银行1000强”中排名前7位，穆迪信用评级为A1。2009年，中国农行由国有独资商业银行整体改制为现代化股份制商业银行，并在2010年完成“A+H”两地上市，总市值位列全球上市银行第五位。2015年入围由中国品牌价值研究院主办的中国品牌500强第23位。\n\t\t 2015年累计办理跨境人民币结算量近2万亿元，其中办理“港股通”跨境人民币资金结算量239亿元，为116家跨国集团企业开展跨境人民币双向资金池归集，金额达130亿元，为多家境外机构提供投资银行间债券市场及RQFII托管服务。   2016年7月20日，《财富》发布了最新的世界500强排行榜，中国农业银行名列第二十九名。  8月，中国农业银行在2016中国企业500强中，排名第7。 ");
			}else if("401".equals(Content)|Content.indexOf("金牛")>=0){
				message = MessageUtil.initTextMessage(ToUserName, FromUserName, MessageUtil.fourthText("<a href=\"http://app.abchina.com/MobileSite/Branch/Branch/Map?branchid=c41cde9f-7060-410e-b621-d15a0e2564e2&queueid=0&sType=0&Channel=3\">进入成都金牛支行营业厅</a> \n","02887658812"));
			}*/
		}else if(MsgType.equals(MessageUtil.MESSAGE_EVENT)){
			String eventType = map.get("Event");
			if(MessageUtil.MESSAGE_SUBSCRIBE.equals(eventType)){
				message = MessageUtil.initTextMessage(ToUserName, FromUserName, "欢迎关注农行成都金牛支行的公众号，请输入“？”按菜单提示操作！");
			}else if(MessageUtil.MESSAGE_CLICK.equals(eventType)){
				String clickKey = map.get("EventKey");
				if("1".equals(clickKey)){
					/*String str = DateUtil.dateToString(new Date(),"yyyy-MM-dd");//获取当前日期
					String hql = "from User u where u.isDelete=0 and u.openID='"+FromUserName+"'";
					List<User> temp = (List<User>) userService.queryObjectList(hql);		
					if(temp.isEmpty()||temp.size()==0){//未注册用户
						message = MessageUtil.initTextMessage(ToUserName,FromUserName,"您尚未注册，不能进行签到。");
					}
					else{
						User user = temp.get(0);
						if(user.getSignIn()!=null){   //签到日期不为空
							if(!DateUtil.dateToString(user.getSignIn(), "yyyy-MM-dd", Locale.getDefault()).equals(str)){   //上次签到日期和当日不相同
								user.setIntegration(user.getIntegration()+INTERATION_RISE);
								user.setSignIn(DateUtil.stringToDate(str, "yyyy-MM-dd"));
								userService.update(user);
								message = MessageUtil.initTextMessage(ToUserName,FromUserName,MessageUtil.firstText(user.getIntegration().toString()));
							}
							else{
								message = MessageUtil.initTextMessage(ToUserName,FromUserName,"今天已成功签到！");
							}
						}
						else{    //第一次注册，签到日期为空，即第一次签到
							user.setIntegration(user.getIntegration()+INTERATION_RISE);
							user.setSignIn(DateUtil.stringToDate(str, "yyyy-MM-dd"));
							userService.update(user);
							message = MessageUtil.initTextMessage(ToUserName,FromUserName,MessageUtil.firstText(user.getIntegration().toString()));
						}
					}*/
				}else if("2".equals(clickKey)){//预约排号
					message = MessageUtil.initTextMessage(ToUserName, FromUserName, MessageUtil.thirdText());
				}else if("3".equals(clickKey)){//新掌银下载
					message = MessageUtil.initImageMessage(ToUserName, FromUserName);
				}else {
					message = MessageUtil.initTextMessage(ToUserName, FromUserName, "~~~~click类型按钮未匹配到对应逻辑处理单元~~~~~~~~KEY值为：“"+clickKey+"”");
				}
			}else if(MessageUtil.MESSAGE_VIEW.equals(eventType)){
				String url = map.get("EventKey");
				message = MessageUtil.initTextMessage(ToUserName, FromUserName, url);
			}else if(MessageUtil.MESSAGE_SCANCODE.equals(eventType)){
				String urlString = map.get("EventKey");
				message = MessageUtil.initTextMessage(ToUserName, FromUserName, urlString);
			}
		}else if(MessageUtil.MESSAGE_LOCATION.equals(MsgType)){
			String label = map.get("Label");
			message = MessageUtil.initTextMessage(ToUserName, FromUserName, label);
		}
		out.print(message);
	} catch (DocumentException e) {
		e.printStackTrace();
	}finally{
		out.close();
	}
}
/**
 * 签到
 * @param req
 * @param resp
 */
@SuppressWarnings("unchecked")
@RequestMapping(value="weixin_signIn.json")
@ResponseBody
protected  Map<String, Object>  signIn(HttpServletRequest req, HttpServletResponse resp){
	Map<String, Object> map=new HashMap<>();
	
	try {		
		User user =(User) req.getSession().getAttribute(SystemConstant.CURRENT_USER);	
		String str = DateUtil.dateToString(new Date(),"yyyy-MM-dd");//获取当前日期
		System.out.println("currentDate："+str);
		if(user!=null&&user.getSignIn()!=null){   //签到日期不为空
//			Date date1=new Date();//当前日期
//			if((date1.getTime()-user.getSignIn().getTime())>=(24*60*60*1000)){    //离上次签到日期已经过了一天
//				user.setIntegration(user.getIntegration()+INTERATION_RISE);
//				user.setSignIn(DateUtil.stringToDate(str, "yyyy-MM-dd HH:mm:ss"));
//				System.out.println(DateUtil.stringToDate(str, "yyyy-MM-dd HH:mm:ss"));
//				userService.update(user);
////				message = MessageUtil.initTextMessage(ToUserName,FromUserName,MessageUtil.firstText(user.getIntegration().toString()));
//				req.getSession().setAttribute(SystemConstant.CURRENT_USER, user);   //更新session
//				map.put("success", true);
//				map.put("msg", "签到成功！");
//				map.put("points", user.getIntegration());
//			}
//			
//			else{
//				map.put("success", false);
//				map.put("msg", "今天已成功签到！");
////				message = MessageUtil.initTextMessage(ToUserName,FromUserName,"今天已成功签到！");
//			}
			/**
			 * 上边注释掉的为过了24小时才能签到
			 * 下边逻辑为取yyyy-MM-dd格式的日期，今天时间和签到时间不一样就可以签到
			 */
			System.out.println("lastSignDate："+DateUtil.dateToString(user.getSignIn(), "yyyy-MM-dd", Locale.getDefault()));
			if(!DateUtil.dateToString(user.getSignIn(), "yyyy-MM-dd", Locale.getDefault()).equals(str)){   //上次签到日期和当日不相同
				user.setIntegration(user.getIntegration()+INTERATION_RISE);
				user.setSignIn(DateUtil.stringToDate(str, "yyyy-MM-dd"));
				System.out.println("translateToDate："+DateUtil.stringToDate(str, "yyyy-MM-dd"));
				userService.update(user);
				req.getSession().setAttribute(SystemConstant.CURRENT_USER, user);   //更新session
				map.put("success", true);
				map.put("msg", "签到成功！");
				map.put("points", user.getIntegration());
				
			}
			else{
				map.put("success", false);
				map.put("msg", "今天已成功签到！");
//				message = MessageUtil.initTextMessage(ToUserName,FromUserName,"今天已成功签到！");
			}			
		}
		else{    //第一次注册，签到日期为空，即第一次签到
			user.setIntegration(user.getIntegration()+INTERATION_RISE);
			user.setSignIn(DateUtil.stringToDate(str, "yyyy-MM-dd"));
			userService.update(user);
//			message = MessageUtil.initTextMessage(ToUserName,FromUserName,MessageUtil.firstText(user.getIntegration().toString()));
			req.getSession().setAttribute(SystemConstant.CURRENT_USER, user);
			map.put("success", true);
			map.put("msg", "签到成功！");
			map.put("points", user.getIntegration());
		}
		
	} catch (Exception e) {
		// TODO: handle exception
		e.printStackTrace();
		map.put("success", false);
		map.put("msg", "系统出错，签到失败！");
	}
	return map;
}
}
